// function Person(name,age,gender) {
//   this.name = name
//   this.age = age
//   this.gender = gender
// }
// 实力对象与构造函数没有直接关系，但是与原型有直接关系
// 构造函数的Prototype引用原型对象
// 原型对的contructor指回构造函数本身
// const person1 = new Person('will',24,'男')
// const person2 = new Person('hehuan',23,'女')
// console.log(person1.__proto__)
// console.log(Person.prototype)
// console.log(Person.prototype.constructor)

// 两个不同的实例拥有相同的原型

// Object.getPrototypeOf(person1) === Person.prototype
// Person.prototype.isPrototypeOf(person1) true

// const person = {
//   name: 'will',
//   age: 24
// }
// const Teacher = {
//   sayHello() {
//     console.log('sayHello')
//   }
// }
// Object.setPrototypeOf() 可以设置一个对象的原型对象是什么，但是这个严重影响性能

// Object.create() 以什么为原型创建一个新的对象
// Object.setPrototypeOf(Teacher,person)
// console.log(Teacher.__proto__)

// 对象.hasOwnProperty(属性) 可以检测属性是实例属性还上还是原型属性

// function hasPrototypeProperty(obj,name) {
//   return  name in obj && !obj.hasOwnProperty(name)
// }
// console.log(hasPrototypeProperty([1,2,3],'toString'))

function Person() {

}
Person.prototype.name = 'will'
Person.prototype.age = 24
Person.prototype.job = 'software'
Person.prototype.sayname = function() {
  console.log(this.name)
}
// let keys = Object.keys(Person.prototype)
// console.log(keys)
let p1 = new Person()
// p1.name = '何欢'
// p1.age = 23
let p1keys = Object.keys(p1)
// for(let item in p1){
//   console.log(p1.hasOwnProperty(item))
// }
// Object.keys()返回对象本身的属性

let keys = Object.getOwnPropertyNames(Person.prototype)// 可以列举不可枚举的属性，比如constructor
// console.log(keys)

for(let item in p1){
  console.log(item)
}
